var MAP;
var NEIGHBORHOODS = new Array();
NEIGHBORHOODS.push( new Neighborhood("paris1","http://googlemapsdemo.chaimae.cloudbees.net/kml/paris1.kml")); 
NEIGHBORHOODS.push( new Neighborhood("paris2","http://googlemapsdemo.chaimae.cloudbees.net/kml/paris2.kml"));
NEIGHBORHOODS.push( new Neighborhood("paris3","http://googlemapsdemo.chaimae.cloudbees.net/kml/paris3.kml"));

shapes = [];
markers = [];

/**
 * Initialisation de la carte
 * @param latitude
 * @param longitude
 */
function initialize(latitude, longitude) {
	var latlng = new google.maps.LatLng(latitude, longitude);
    var myOptions = {
	  	      zoom: 11,
	  	      center: latlng,
	  	      mapTypeId: google.maps.MapTypeId.ROADMAP
	  	    };
	MAP = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
	
	clearOverlays();
	addOverlays();
}

/**
 * Affichage des polygones et Rafraichissement de la carte
 * @param longitude
 * @param latitude
 * @param arrondissement
 * @param checked
 */
function showArrondissement(arrondissement) {
	for (var i = 0; i < NEIGHBORHOODS.length; i++) {
		if (arrondissement == NEIGHBORHOODS[i].id) {
			NEIGHBORHOODS[i].drawit = true;
			break;
		}
    }

    addOverlays();
}

/**
 * Ajoute un marqueur statique
 * 
 * @param id
 * @param lat
 * @param lng
 */
function addStaticMarker(id, lat, lng) {
	if (!contains(markers,id)) {
		createMarker(lat, lng);	
		markers.push(id);
	}
}

/**
 * Ajoute un marqueur déplaçable
 * @param id
 * @param lat
 * @param lng
 */
function addDraggableMarker(id, lat, lng) {
	if (!contains(markers,id)) {
		createDraggableMarker(lat, lng);
		markers.push(id);
	}
}

/**
 * fonction private pour créer une marqueur statique avec infobulle
 * @param lat
 * @param lng
 */
function createMarker(lat, lng) {
	var point = new google.maps.LatLng(lat, lng);
	
	// ajouter le marqueur dans la carte
	var marker = new google.maps.Marker({
	      position: point,
	      map: MAP
	    });
	
	// ajouter l'info bulle en cliquant sur le marqueur 
	var infowindow = new google.maps.InfoWindow();
	google.maps.event.addListener(marker, "click", function() {
		infowindow.setContent("The GLatLng value is: " + marker.getPosition() + " at zoom level " + MAP.getZoom());
		infowindow.open(MAP,marker);
	});
	
	MAP.setCenter(point);
}

/**
 * fonction private pour créer un marqueur déplaçable avec infobulle
 * @param lat
 * @param lng
 */
function createDraggableMarker(lat, lng) {
	var point = new google.maps.LatLng(lat, lng);
	
	var marker = new google.maps.Marker({
	      position: point,
	      map: MAP,
	      draggable: true
	    });
	
	var infowindow = new google.maps.InfoWindow();
	
	google.maps.event.addListener(marker, "click", function() {
		infowindow.setContent("The GLatLng value is: " + marker.getPosition() + " at zoom level " + MAP.getZoom());
		infowindow.open(MAP,marker);
	});
	
	google.maps.event.addListener(marker, "dragstart", function() {
		infowindow.close();
    });

	google.maps.event.addListener(marker, "dragend", function() {
		infowindow.setContent("The GLatLng value is: " + marker.getPosition() + " at zoom level " + MAP.getZoom());
		infowindow.open(MAP,marker);     
    });
	
	MAP.setCenter(point);	
}

/**
 * fonction private pour supprimer les polygones et les marqueurs de la carte
 */
function clearOverlays() {
	for (var i = 0; i < NEIGHBORHOODS.length; i++) {
		NEIGHBORHOODS[i].drawit = false;
    }
	
	markers = [];
	shapes = [];	
}

/**
 * fonction private pour ajouter les polygones depuis le kml
 */
function addOverlays() {
	// ADD OVERLAY
	for (var i = 0; i < NEIGHBORHOODS.length; i++) {
		if (NEIGHBORHOODS[i].drawit && !contains(shapes,NEIGHBORHOODS[i].id)) {
			// afficher un polygone depuis le fichier kml
			var ctaLayer = new google.maps.KmlLayer(NEIGHBORHOODS[i].kml);
            ctaLayer.setMap(MAP);
            shapes.push(NEIGHBORHOODS[i].id);
		}
	}
}

/**
 * Classe pour définir un kml
 */
function Neighborhood(id, kml) {
    this.id = id;
    this.drawit = false;
    this.kml = kml;
}

/**
 * fonction private pour voir si le tableau contient déjà l'objet passé en paramètre
 * @param a
 * @param obj
 * @returns
 */
function contains(a, obj) {
    var i = a.length;
    while (i--) {
       if (a[i] === obj) {
           return true;
       }
    }
    return false;
}